-- 1. 获取可重入锁脚本
-- 参数说明：
-- KEYS[1] 锁的名称（例如："lock:order:1001"）
-- ARGV[1] 锁的过期时间（毫秒）
-- ARGV[2] 线程唯一标识（例如："thread:12345"）
local lockKey = KEYS[1]
local expireTime = ARGV[1]
local threadId = ARGV[2]

-- 检查锁是否存在
local currentLock = redis.call('hget', lockKey, 'owner')

-- 情况1：锁不存在，直接获取
if not currentLock then
    redis.call('hset', lockKey, 'owner', threadId)
    redis.call('hset', lockKey, 'count', 1)
    redis.call('pexpire', lockKey, expireTime)
    return 1    -- 获取成功
end

-- 情况2：锁已存在且为当前线程持有（可重入）
if currentLock == threadId then
    local currentCount = tonumber(redis.call('hget', lockKey, 'count'))
    redis.call('hset', lockKey, 'count', currentCount + 1)
    redis.call('pexpire', lockKey, expireTime)  -- 刷新过期时间
    return 1    -- 重入成功
end

-- 情况3：锁被其他线程持有
do
    return 0    -- 获取失败
end
